<?php
require_once '../common/RootPath.php';
RootPath::importPath("config/profile.inc.php");
class StringRedisTemplate
{
    private $redis_host = REDIS_HOST;//主机名
    private $redis_port = REDIS_PORT;//端口号
    private $redis_pass = REDIS_PASS;//密码

    private $redisClient;

    private static $instance = null; // 存儲唯一實例

    // 私有構造函數，防止外部實例化
    private function __construct() {}

    // 禁止克隆對象
    private function __clone() {}

    // 禁止反序列化對象
    private function __wakeup() {}

    public static function opsForValue() {

        if (self::$instance === null) {
            $instance = self::$instance = new self();
            $instance->connectDb();//连接redis服务器
        }
        return self::$instance;
    }

    private function connectDb()
    {
        try {
            $redis = new Redis();
            // 连接到远程 Redis
            if ($redis->connect($this->redis_host, $this->redis_port)) {
//                echo "成功连接到 Redis 服务器" . PHP_EOL;

                // 如果需要认证
                if ($this->redis_pass) {
                    if ($redis->auth($this->redis_pass)) {
                        // echo "认证成功" . PHP_EOL;
                        $this->redisClient = $redis;
                    } else {
                        throw new Exception("认证失败");
                    }
                }

            } else {
                echo "连接失败" . PHP_EOL;
            }
        } catch (Exception $e) {
            echo "错误: " . $e->getMessage();
        }

    }



    //设置值
    public function set($key, $value)
    {
        $this->redisClient->set($key, $value);
    }

    //获取值
    public function get($key)
    {
        return $this->redisClient->get($key);
    }

    // 设置带过期时间的键 (10秒)
    public function setex($key,$expire,$value){
        $this->redisClient->setex($key,$expire, $value);
    }

    //删除单个key
    public function delete($key)
    {
        $this->redisClient->del($key);
    }

    //判断是否失效
    public function exists($key)
    {
        return $this->redisClient->exists($key);
        //返回值：
        //1：键存在
        //0：键不存在或已过期
    }

    //检查剩余生存时间
    public function ttl($key)
    {
        return $this->redisClient->ttl($key);

        //>0：键将在 N 秒后过期
        //-1：键存在但没有设置过期时间
        //-2：键已过期或不存在
    }


    //获取毫秒级过期时间
    public function pttl($key)
    {
        return $this->redisClient->pttl($key);

        //>0：键将在 N 秒后过期
        //-1：键存在但没有设置过期时间
        //-2：键已过期或不存在
    }
}

//$arr = array(
//    'host' => '175.178.27.211',
//    'port' => '6379',
//    'pass' => '1234',
//);
//
//$stringRedisTemplate = new StringRedisTemplate($arr);
//echo $stringRedisTemplate->exists("greeting");

/*   public function __construct($config = array())
   {

       $this->redis_host = $config['host'];
       $this->redis_port = $config['port'];
       $this->redis_pass = $config['pass'];
       $this->connectDb();//连接redis服务器

   }  */